/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tela;

import ferramentas.Query;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import pessoal.CursoIPES;
import pessoal.CursoIPESMunicipio;
import pessoal.GestorIPES;
import pessoal.Municipio;

/**
 *
 * @author Lauro
 */
public class CadastrarCursoIpes extends HttpServlet {

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            GestorIPES gestor = (GestorIPES) request.getSession().getAttribute("usuario");
            if (gestor != null) {

                int nivel = Integer.parseInt(request.getParameter("nivel"));
                int curso = Integer.parseInt(request.getParameter("curso"));
                int grau = Integer.parseInt(request.getParameter("grau"));
                int modalidade = Integer.parseInt(request.getParameter("modalidade"));
                int status = Integer.parseInt(request.getParameter("status"));

                String[] municipiosIds = request.getParameterValues("municipios");

                if (nivel != 0 && curso != 0 && grau != 0 && modalidade != 0 && status != 0 && municipiosIds.length > 0) {
                    Query q = new Query(true);
                    CursoIPES cursoIpes = q.getCursoIpes(nivel, curso, grau, modalidade, status, gestor.getIpesId());
                    if (cursoIpes == null) {
                        for (String id : municipiosIds) {
                            int municipio = Integer.parseInt(id);
                            CursoIPESMunicipio cursoIpesM = new CursoIPESMunicipio(gestor.getIpesId(),
                                    nivel, curso, grau, modalidade, status, municipio);
                            q.inserirCursoIpes(cursoIpesM);
                        }
                    } else {
                        List<Municipio> municipios = cursoIpes.getMunicipios();
                        List<Integer> municipiosAdicionar = getMunicipiosAdicionar(municipios, municipiosIds);
//                        List<Integer> municipiosRemover = getMunicipiosRemover(municipios, municipiosIds);
                        for(Integer municipio:municipiosAdicionar){
                            CursoIPESMunicipio cursoIpesM = new CursoIPESMunicipio(gestor.getIpesId(), nivel, curso, grau, modalidade, status, municipio.intValue());
                            q.inserirCursoIpes(cursoIpesM);
                        }
                        
//                        for(Integer municipio:municipiosRemover){
//                            CursoIPESMunicipio cursoIpesM = new CursoIPESMunicipio(gestor.getIpesId(), nivel, curso, grau, modalidade, status, municipio.intValue());
//                            q.removerCursoIpes(cursoIpesM);
//                        }
                    }
                    
                    q.atualizarUltimaModificacaoIpes(gestor.getIpesId());

                    out.println("Curso inserido com sucesso!");
                    out.println("<script>window.alert('Curso inserido com sucesso!');</script>");
                    out.println("<script>document.location.href='index.jsp?conteudo=admin#aba6';</script>");
                } else {
                    out.println("Ocorreu um erro! Por favor, tente novamente mais tarde.");
                    out.println("<script>window.alert('Ocorreu um erro! Por favor, tente novamente mais tarde.');</script>");
                    out.println("<script>document.location.href='index.jsp?conteudo=admin#aba6';</script>");
                }
            } else {
                out.println("Você precisa estar logado efetuar essa operação!!");
                out.println("<script>window.alert('Você precisa estar logado efetuar essa operação!!');</script>");
                out.println("<script>document.location.href='index.jsp';</script>");
            }
        } catch (SQLException ex) {
            Logger.getLogger(AtualizacaoDemanda.class.getName()).log(Level.SEVERE, null, ex);
            out.println("Ocorreu um erro! Por favor, tente novamente mais tarde.");
            out.println("<script>window.alert('Ocorreu um erro! Por favor, tente novamente mais tarde.');</script>");
            out.println("<script>document.location.href='index.jsp?conteudo=admin#aba6';</script>");
        } catch (ClassCastException ex) {
            out.println("Você precisa das permissões necessárias para efetuar essa operação!!");
            out.println("<script>window.alert('Você precisa das permissões necessárias para efetuar essa operação!!');</script>");
            out.println("<script>document.location.href='index.jsp';</script>");
        } finally {
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    private List<Integer> getMunicipiosAdicionar(List<Municipio> municipios, String[] municipiosIds) {
        List<Integer> adicionar = new ArrayList<Integer>();
        for (String municipio : municipiosIds) {
            int id = Integer.parseInt(municipio);
            if(!contemId(id, municipios)){
                adicionar.add(id);
            }
        }
        return adicionar;
    }

    private boolean contemId(int id, List<Municipio> municipios) {
        for(Municipio m:municipios){
            if(m.getMunicipioId() == id){
                return true;
            }
        }
        return false;
    }
    
    private List<Integer> getMunicipiosRemover(List<Municipio> municipios, String[] municipiosIds) {
        List<Integer> remover = new ArrayList<Integer>();
        for (Municipio m:municipios) {
            int id = m.getMunicipioId();
            if(!contemId(id, municipiosIds)){
                remover.add(id);
            }
        }
        return remover;
    }

    private boolean contemId(int id1, String[] municipiosIds) {
        for (String municipio : municipiosIds) {
            int id2 = Integer.parseInt(municipio);
            if(id2 == id1){
                return true;
            }
        }
        return false;
    }
}
